#include <stdio.h>  
#include <string.h>  
#include <sys/stat.h>  

/* 将文件模式转换为字符串表示 */  
void mode_to_letters(int mode, char str[])  
{  
    strncpy(str, "---------", 10); // 默认 = 无权限  
    str[9] = '\0'; // 添加字符串终止符  

    // 文件类型判断  
    if (S_ISDIR(mode))  
        str[0] = 'd'; // 目录  
    else if (S_ISCHR(mode))  
        str[0] = 'c'; // 字符设备  
    else if (S_ISBLK(mode))  
        str[0] = 'b'; // 块设备  
    else if (S_ISLNK(mode))  
        str[0] = 'l'; // 符号链接  
    else if (S_ISFIFO(mode))  
        str[0] = 'p'; // 命名管道  
    else if (S_ISSOCK(mode))  
        str[0] = 's'; // 套接字  

    // 用户权限  
    if (mode & S_IRUSR)  
        str[1] = 'r'; // 用户读权限  
    if (mode & S_IWUSR)  
        str[2] = 'w'; // 用户写权限  
    if (mode & S_IXUSR)  
        str[3] = 'x'; // 用户执行权限  

    // 组权限  
    if (mode & S_IRGRP)  
        str[4] = 'r'; // 组读权限  
    if (mode & S_IWGRP)  
        str[5] = 'w'; // 组写权限  
    if (mode & S_IXGRP)  
        str[6] = 'x'; // 组执行权限  

    // 其他用户权限  
    if (mode & S_IROTH)  
        str[7] = 'r'; // 其他用户读权限  
    if (mode & S_IWOTH)  
        str[8] = 'w'; // 其他用户写权限  
    if (mode & S_IXOTH)  
        str[9] = 'x'; // 其他用户执行权限  
}  

int main(void)  
{  
    struct stat fileStat;  
    const char *filename = "ls1.c";  
    char permissions[10];  

    if (stat(filename, &fileStat) < 0) {  
        perror("stat");  
        return 1;  
    }  

    mode_to_letters(fileStat.st_mode, permissions);  
    printf("权限: %s\n", permissions);  

    return 0;  
}
